home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.whtech.com
/
ftp.whtech.com.tar
/
ftp.whtech.com
/
datasheets and manuals
/
Hardware
/
WHT
/
scsi
/
dsr_sources_2_2001
/
0dsr
next >
Wrap
Text File
|
2006-10-19
|
8KB
|
391 lines
* DEVICE SERVICE ROUTINES
*
* This modules takes care of all the high level I/O to
* the SCSI drives (Open, close, read, write, etc)
*
SCSI0 CLR R6
JMP SCSDSR
SCSI1 LI R6,>0100
JMP SCSDSR
SCSI2 LI R6,>0200
JMP SCSDSR
SCSI3 LI R6,>0300
JMP SCSDSR
SCSI4 LI R6,>0400
JMP SCSDSR
SCSI5 LI R6,>0500
JMP SCSDSR
SCSI6 LI R6,>0600
JMP SCSDSR
SCSI7 LI R6,>0700
JMP SCSDSR
DSK1 LI R6,>0001
SCSDSR
ANDI R12,>FF00
AI R12,24
LDCR @ZERO,4 Make sure RAM bank 0 is active
MOV R1,@SAVR1
MOV R11,@SAVR11
LI R0,STINIT Reset the stack pointer for BANKIT
MOV R0,@STACK
* Copy the PAB to our buffer and the file name to the
* name compare buffer in RAM bank 2
*
MOV @>8356,R4
S @>8354,R4
AI R4,-10
MOV R4,@PABADR
SWPB R4
MOVB R4,@VDPWA
SWPB R4
MOVB R4,@VDPWA
LI R5,10
LI R4,PABBUF
SCSD01 MOVB @VDPRD,*R4+
DEC R5
JNE SCSD01
* Now make sure we're not trying to do I/O to the
* SCSI card.
*
ANDI R12,>FF00
AI R12,8
CLR R2
STCR R2,3 Read SCSI address of the card
CB R2,R6 See if it matches
JNE DSR3
BL @DSRERR
DATA >0300 Illegal operation
DSR3
*
* Now copy the name of the file to the name compare
* buffer in banks 2 and 4.
* We also check that the name is not longer than 40
* characters, contains only valid characters and
* that there are not more than 10 characters between
* periods.
*
* If we are doing DSK emulation, prefix the filename
* with the appriproate directory
*
MOVB @PABBUF+9,R1 Set the file name length
SRL R1,8
ANDI R12,>FF00
AI R12,24
LDCR @B02,4 Select RAM bank 2
LI R3,NCB Name Compare Buffer
LI R2,40 Maximum name length
CLR R7 Number of characters between periods
JMP DSR5
DSR4 BL @DSRERR Name too long!
DATA >0700 Bad open attribute?
DSR5
* If we are doing DSKx emulation, prefix the filename
*
MOV R6,R8
ANDI R8,>00FF
JEQ DSR5B
MOV @DS,*R3+ copy the 'DS'
MOVB @ASCIIK,*R3+ copy the 'K'
AI R8,48
SWPB R8
MOVB R8,*R3+
MOVB @PERIOD,*R3+
AI R2,-5 Maximum length is 5 less
DSR5B C R1,@>8354
JEQ DSR7 Pad everything!
S @>8354,R1 Subtract device name length
DEC R1 Account for period after device name
JEQ DSR7
C R1,R2 See if name > 40 characters
JH DSR4
S R1,R2 Compute number of spaces we will have to pad
MOVB @>8357,@VDPWA Set VDP read address to
NOP file name
MOVB @>8356,@VDPWA
NOP
MOVB @VDPRD,R0 Ignore the period after the device name
NOP
DSR5A MOVB @VDPRD,R5
CB R5,@SPACE
JLE DSR4 Illegal character
CB R5,@B126
JH DSR4 Illegal character
MOVB R5,*R3+
CB R5,@PERIOD
JNE DSR6
CI R7,0
JEQ DSR4
CI R7,10
JH DSR4
SETO R7
DSR6 INC R7
DEC R1
JNE DSR5A
* Make sure the last part of the name is not too long
*
CI R7,10
JH DSR4
* Now pad the rest of the name with spaces
*
CI R2,0
JEQ DSR8
DSR7 MOVB @SPACE,*R3+
DEC R2
JNE DSR7
* Now copy it to the name compare buffer in bank 4
*
DSR8 LI R3,NCB
LI R2,40
DSR9 MOV *R3,R4
LDCR @B04,4
MOV R4,*R3+
LDCR @B02,4
DECT R2
JNE DSR9
* Check the I/O Opcode and call the appripriate routine
*
* If we are doing DSKx emulation, only let the LOAD I/O
* op code go through.
LDCR @ZERO,4
CB @PABBUF,@B05
JNE DSR10
DSRIO5 BL @XFER
DATA LOAD
DSR10
MOV R6,R0 Check for emulation
ANDI R0,>00FF
JNE DSR19
MOVB @PABBUF,R1
SRL R1,8
CI R1,9
JH DSR18
SLA R1,1
MOV @IOJTBL(R1),R1
B *R1
IOJTBL DATA DSRIO0
DATA DSRIO1
DATA DSRIO2
DATA DSRIO3
DATA DSRIO4
DATA DSRIO5
DATA DSRIO6
DATA DSRIO7
DATA DSR18
DATA DSRIO9
DSRIO0 BL @XFER
DATA OPEN
DSRIO1 BL @XFER
DATA CLOSE
DSRIO2 BL @XFER
DATA READ
DSRIO3 BL @XFER
DATA WRITE
DSRIO4 BL @XFER
DATA REWIND
DSRIO6 BL @XFER
DATA SAVE
DSRIO7 BL @XFER
DATA DELETE
DSRIO9 BL @XFER
DATA STATUS
DSR18
ANDI R12,>FF00
MOV @SAVR1,R1
MOV @SAVR11,R11
INCT R11
DSR19 RT
**
*
* Here is where we have to compare label names to
* see which disk we are truely accessing.
*
**
DSR20 ANDI R12,>FF00
AI R12,24
LDCR @ZERO,4
MOV R1,@SAVR1
MOV R11,@SAVR11
LI R0,STINIT Reset the stack pointer for BANKIT
MOV R0,@STACK
* Now we have to check our table of disk labels. If the VIB
* hasn't been read on a disk yet, the entry will be null.
* Copy the PAB from VDP memory to a buffer in bank 0
MOV @>8356,R4 Get pointer to file name
S @>8354,R4
AI R4,-10
MOV R4,@PABADR
SWPB R4
MOVB R4,@VDPWA
SWPB R4
MOVB R4,@VDPWA
LI R5,10
LI R4,PABBUF
DSR21 MOVB @VDPRD,*R4+
DEC R5
JNE DSR21
DEC R4
MOVB *R4,R2 Get file name length
SRL R2,8
S @>8354,R2
JEQ DSR23 No label given - error
DEC R2
JEQ DSR23
MOVB @>8357,@VDPWA
NOP
MOVB @>8356,@VDPWA
NOP
MOVB @VDPRD,R0 Ignore the period
LDCR @B02,4 Select RAM bank 2
LI R3,NCB
DSR22 MOVB @VDPRD,R0
DEC R2
CB R0,@PERIOD
JEQ DSR25
MOVB R0,*R3+
CI R2,0
JEQ DSR25
CI R3,NCB+10
JNE DSR22
* The label given is longer than 10 characters. No way can it
* match anything. Give up here.
DSR23 LDCR @ZERO,4
MOV @SAVR1,R1
ANDI R12,>FF00
RT
DSR24 MOVB @SPACE,*R3+
DSR25 CI R3,NCB+10
JNE DSR24
**
*
* Now that we have the label in our compare buffer, check to
* see if there are any SCSI drives that have a label that
* matches.
*
**
CLR R6 Start with SCSI ID=0
LI R5,DLTABL
LDCR @B02,4 Select RAM bank 2
DSR26 C *R5,@MINUS1
JEQ DSR28
C *R5,@ZERO
JNE DSR31
LDCR @ZERO,4 We have to read the label
CLR R7
CLR R8
BLWP @BANKIT
DATA SCSIRD
JEQ DSR29
DSR27 SETO *R5
DSR28 LDCR @B02,4
AI R5,10
AI R6,>0100
CI R6,>0800
JNE DSR26
JMP DSR23 No match - error
DSR29 LI R7,SECBUF * Now move label to table
LI R0,10
DSR30 MOV *R7+,R8
LDCR @B02,4
MOV R8,*R5+
LDCR @ZERO,4
DECT R0
JNE DSR30
LDCR @B02,4
AI R5,-10
DSR31 LI R0,10
LI R7,NCB
MOV R5,R8
DSR32 C *R7+,*R8+
JNE DSR28
DECT R0
JNE DSR32
* Hooray! We found a match! Now copy the real filename to
* the filename compare buffer
LI R3,NCB
CI R2,0 Check for no name (i.e.
JEQ DSR34 directory access)
CI R2,40 Check file name length
JLE DSR33
BL @DSRERR File name too long!
DATA >0700
DSR33 MOVB @VDPRD,*R3+
DEC R2
JNE DSR33
DSR34 CI R3,NCB+40
JEQ DSR35
MOVB @SPACE,*R3+
JMP DSR34
DSR35 B @DSR8
* Let's display our file name for fun
*
*DSR35 CLR @VDPWA
* LI R1,>4040
* MOV R1,@VDPWA
* LI R0,40
* LI R3,NCB
*SR999 MOVB *R3+,@VDPWD
* DEC R0
* JNE DSR999
*SR888 JMP DSR888
DS DATA 'DS'
MINUS1 DATA >FFFF
ASCIIK BYTE 'K'
B126 BYTE 126